/*
给定一个单链表，把所有的奇数节点和偶数节点分别排在一起。请注意，这里的奇数节点和偶数节点指的是节点编号的奇偶性，而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1)，时间复杂度应为 O(nodes)，nodes 为节点总数。

示例 1:

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:

输入: 2->1->3->5->6->4->7->NULL 
输出: 2->3->6->7->1->5->4->NULL
说明:

应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点，第二个节点视为偶数节点，以此类推。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/odd-even-linked-list
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
#include <iostream>
#include <vector>

using namespace std;

class Solution;

class ListNode {

friend class Solution;
public:
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        ListNode* odd=head;
        ListNode* even=head->next;
        ListNode* copy=even;
        while(even->next!=NULL){
            cout<<"odd:"<<odd->val<<",even:"<<even->val<<endl;
            if(even->next!=NULL){
                odd->next=even->next;
                odd=even->next;
            }
            if(odd->next!=NULL){
                even->next=odd->next;
                even=odd->next;
            }
            cout<<"odd:"<<odd->val<<",even:"<<even->val<<endl;
            if(odd->next==NULL){
                break;
            }
            if(even->next==NULL){
                break;
            }
            /*
            if(odd->next->next==NULL){
                break;
            }
            if(even->next->next==NULL){
                break;
            }
            */
        }
        cout<<"out even:"<<even->val<<endl;
        if(even->next!=NULL){
            cout<<"odd:"<<odd->val<<",even:"<<even->val<<endl;
            odd->next=even->next;
            odd=odd->next;
            cout<<"odd:"<<odd->val<<",even:"<<even->val<<endl;
        }
        even->next=NULL;
        odd->next=copy;
        return head;
    }
};

int main(){
    ListNode* node8=new ListNode(8);
    ListNode* node7=new ListNode(7);
    node7->next=node8;
    ListNode* node6=new ListNode(6);
    node6->next=node7;
    
    ListNode* node5=new ListNode(5);
    node5->next=node6;
    ListNode* node4=new ListNode(4);
    node4->next=node5;
    ListNode* node3=new ListNode(3);
    node3->next=node4;
    ListNode* node2=new ListNode(2);
    node2->next=node3;
    ListNode* node1=new ListNode(1);
    node1->next=node2;
    
    Solution s;
    ListNode* res=s.oddEvenList(node1);
    while(res!=NULL){
        cout<<res->val<<" ";
        res=res->next;
    }
    cout<<endl;
    return 0;
}

//1 2 3 4 5 6 7

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if(head==NULL||head->next==NULL){
            return head;
        }
        ListNode* odd=head;
        ListNode* even=head->next;
        ListNode* copy=even;
        while(even->next!=NULL){
            //cout<<"odd:"<<odd->val<<",even:"<<even->val<<endl;
            if(even->next!=NULL){
                odd->next=even->next;
                odd=even->next;
            }
            if(odd->next!=NULL){
                even->next=odd->next;
                even=odd->next;
            }
            //cout<<"odd:"<<odd->val<<",even:"<<even->val<<endl;
            if(odd->next==NULL){
                break;
            }
            if(even->next==NULL){
                break;
            }
            /*
            if(odd->next->next==NULL){
                break;
            }
            if(even->next->next==NULL){
                break;
            }
            */
        }
        //cout<<"out even:"<<even->val<<endl;
        if(even->next!=NULL){
            //cout<<"odd:"<<odd->val<<",even:"<<even->val<<endl;
            odd->next=even->next;
            odd=odd->next;
            //cout<<"odd:"<<odd->val<<",even:"<<even->val<<endl;
        }
        even->next=NULL;
        odd->next=copy;
        return head;
    }
};